上一篇我們部署了 Nginx ,這些部署的順序是有關係的,昨天先部署 Nginx ,是因為我們可以先確定 host docker 的 VM 是否可用,還有理論上其他微服務都還沒起來,Nginx 的 reverse proxy 會遇到 time out,藉此也可以先 verify 我們 50X(500, 502, 501, 503, 504...etc)的預設頁面是否可用。
而今天要來部署 db 。正統的 db 部署最少也要考慮高可用性(HA, High Availablility),但在開發與原型製作(Prototyping)階段,往往我們需要的是一個可用的 db 就好,然後就能盡快開工,以下示範用 ansible 迅速起一個 PG 10 的 db。
$ cat roles/tasks/run_postgresql.yaml
- name: Docker | Start postgresql.mytodos
docker_container:
name: postgresql.mytodos
state: started
domainname: postgresql.mytodos
image: postgres:10-alpine
networks:
- name: mynet
aliases: postgresql.mytodos
ipv4_address: 172.20.0.3
ports:
- '5432:5432'
env:
POSTGRES_DB: "{{ pg_db }}"
POSTGRES_USER: "{{ pg_user }}"
POSTGRES_PASSWORD: "{{ pg_pass }}"
volumes:
- /usr/share/zoneinfo/UTC:/etc/localtime:ro
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- "{{ prd_dir }}/postgresql/data/mnt:/var/lib/postgresql/data"
- "{{ prd_dir }}/postgresql/log:{{ prd_dir }}/postgresql/log"
restart: true
recreate: true
- name: File | Remove Directories
file:
path: /tmp/pg_sql
state: absent
owner: centos
group: centos
- name: File | Create Directories
file:
path: /tmp/pg_sql
state: directory
owner: centos
group: centos
- name: Copy to Remote | Copy PG Schema to remote
copy:
owner: centos
src: "{{ dev_dir }}/files/sql.d/schema/create_todos_schema.sql"
dest: /tmp/pg_sql/001.sql
- name: Template | Replace Template and Send to Remote
vars:
todo_serial: "{{ item.serial }}"
todo_userid: "{{ item.userid }}"
todo_title: "{{ item.title }}"
with_items: "{{ todo_items }}"
template:
owner: centos
src: "{{ dev_dir }}/files/sql.d/data/insert_default_todos.sql.j2"
dest: "/tmp/pg_sql/002.{{ todo_serial }}.sql"
- name: Shell | Create DB and ignore failure
shell: 'PGPASSWORD={{ pg_pass }} $(which psql) -U "{{ pg_user }}" -h 172.20.0.3 -d postgres -c "CREATE DATABASE {{ pg_db }};"'
ignore_errors: yes
- name: Shell | Apply PG schema on remote machine
shell: 'cd /tmp/pg_sql; find . -type f -name "*.sql" | sort -n | while read f; do PGPASSWORD={{ pg_pass }} $(which psql) -U "{{ pg_user }}" -h 172.20.0.3 "{{ pg_db }}" -f $(basename $f) ; done'
可以看到 db 相關的環境變數,其實是從 host VM 上的環境變數一路傳遞進來,為的是避免顯式地暴露使用者名稱與密碼在版控 a.k.a Git 裡
~/.bash_profile
或 ~/.bashrc
裡source ~/.bash_profile
以下的寫法,可以寫在 inventory 裡,作為全域通用的代換
[all:vars]
pg_db=todos
pg_user="{{ lookup('env', 'MY_TODOS_PG_USER') }}"
pg_pass="{{ lookup('env', 'MY_TODOS_PG_PASS') }}"
關於資料庫的設定,還有 init 的 script 、預設塞入的資料、安全性設定…種種非常多的細節,幸運的是,大多數這些需求都可以用 ansible 腳本設定地妥妥當當,但這邊如果全部的細節都開展下去,會把篇幅拉得非常長,我就點到為止,較完整的 script 詳參 Day10 完全體的 repo